জাভা জেনেরিক্স মূলত টাইপ-সেইফটি নিশ্চিত করতে এবং ClassCastException এড়ানোর জন্য ডিজাইন করা হয়েছে। এটি Runtime Type Checking-এও সাহায্য করে, যেখানে কম্পাইল-টাইমে অনেক সমস্যার সমাধান হয়। তবে, কিছু নির্দিষ্ট ক্ষেত্রে জেনেরিক্স ব্যবহার করার সময় এই চ্যালেঞ্জগুলো গুরুত্বপূর্ণ হয়ে ওঠে।
ClassCastException এবং জেনেরিক্স
ClassCastException ঘটে যখন কোনো অবজেক্টকে ভুল টাইপে কাস্ট করার চেষ্টা করা হয়। জেনেরিক্স টাইপ সেফটি নিশ্চিত করে এই সমস্যা সমাধান করে।
জেনেরিক্স ছাড়া উদাহরণ:
import java.util.ArrayList;
import java.util.List;
public class WithoutGenerics {
public static void main(String[] args) {
List list = new ArrayList();
list.add("Hello");
list.add(10); // Adding Integer to a raw type list
// Type casting required
for (Object obj : list) {
String str = (String) obj; // Throws ClassCastException for Integer
System.out.println(str);
}
}
}
আউটপুট:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
জেনেরিক্স দিয়ে সমাধান:
import java.util.ArrayList;
import java.util.List;
public class WithGenerics {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(10); // Compile-time error: incompatible types
for (String str : list) {
System.out.println(str);
}
}
}
আউটপুট:
Hello
Runtime Type Checking
জেনেরিক্স টাইপ চেকিং Compile-Time-এ ঘটে। তবে জাভার Type Erasure-এর কারণে Runtime-এ জেনেরিক টাইপ সম্পর্কিত তথ্য মুছে যায়।
Type Erasure এবং Runtime Type Checking উদাহরণ
import java.util.ArrayList;
public class TypeErasureExample {
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("Hello");
// At runtime, the type information is erased
if (stringList instanceof ArrayList) {
System.out.println("This is an ArrayList");
}
// Following will cause a compile-time error:
// if (stringList instanceof ArrayList<String>) { }
}
}
আউটপুট:
This is an ArrayList
ClassCastException এড়াতে জেনেরিক্সের ভূমিকা
- Raw Type এড়ানো: জেনেরিক্স ব্যবহার করে টাইপ সেফ লিস্ট তৈরি করুন।
- Compile-Time Checking: টাইপ মিসম্যাচ আগে থেকেই শনাক্ত হয়।
- কাস্টিং এড়ানো: টাইপ কাস্টিং ছাড়া সরাসরি উপযুক্ত টাইপ ব্যবহার করা যায়।
Type Checking জেনেরিক মেথডে
public class GenericTypeCheck {
public static <T> void addIfInstance(List<T> list, Object obj) {
if (obj.getClass().isInstance(list.get(0))) {
list.add((T) obj);
} else {
System.out.println("Type mismatch");
}
}
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("Java");
addIfInstance(stringList, "Generics"); // Works
addIfInstance(stringList, 10); // Prints "Type mismatch"
}
}
আউটপুট:
Type mismatch
কোডে ClassCastException এর প্রকৃত ব্যবস্থাপনা
Custom Runtime Checks:
public static <T> void safeAdd(List<T> list, Object obj) { if (obj instanceof String) { list.add((T) obj); // Only if type matches } else { System.out.println("Cannot add incompatible type"); } }Generic Wrapper Class:
public class SafeWrapper<T> { private T data; public SafeWrapper(T data) { this.data = data; } public T getData() { return data; } }
- ClassCastException এড়াতে জেনেরিক্স অপরিহার্য।
- Compile-Time Type Checking জাভার টাইপ সেফ কোড নিশ্চিত করে।
- Runtime Type Checking বিশেষ ক্ষেত্রে দরকার হতে পারে, তবে এটি Type Erasure-এর কারণে সীমাবদ্ধ।
- সঠিক ব্যবহারে জেনেরিক্স বড় আকারের প্রজেক্টে বাগ-মুক্ত কোড তৈরি করতে সাহায্য করে।
Read more